<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Chapter 15. Расширенные возможности</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.75.1">
<link rel="home" href="index.html" title="Руководство по Smarty">
<link rel="up" href="smarty.for.programmers.html" title="Part III. Smarty для программистов">
<link rel="prev" href="caching.cacheable.html" title="Управление кэшированием результатов работы плагинов">
<link rel="next" href="advanced.features.prefilters.html" title="Префильтры">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<div class="navheader">
<table width="100%" summary="Navigation header">
<tr><th colspan="3" align="center">Chapter 15. Расширенные возможности</th></tr>
<tr>
<td width="20%" align="left">
<a accesskey="p" href="caching.cacheable.html">Prev</a> </td>
<th width="60%" align="center">Part III. Smarty для программистов</th>
<td width="20%" align="right"> <a accesskey="n" href="advanced.features.prefilters.html">Next</a>
</td>
</tr>
</table>
<hr>
</div>
<div class="chapter" title="Chapter 15. Расширенные возможности">
<div class="titlepage"><div><div><h2 class="title">
<a name="advanced.features"></a>Chapter 15. Расширенные возможности</h2></div></div></div>
<div class="toc">
<p><b>Table of Contents</b></p>
<dl>
<dt><span class="sect1"><a href="advanced.features.html#advanced.features.objects">Объекты</a></span></dt>
<dt><span class="sect1"><a href="advanced.features.prefilters.html">Префильтры</a></span></dt>
<dt><span class="sect1"><a href="advanced.features.postfilters.html">Постфильтры</a></span></dt>
<dt><span class="sect1"><a href="advanced.features.outputfilters.html">Фильтры вывода</a></span></dt>
<dt><span class="sect1"><a href="section.template.cache.handler.func.html">Управление кэшированием</a></span></dt>
<dt><span class="sect1"><a href="template.resources.html">Ресурсы</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="template.resources.html#templates.from.template.dir">Шаблоны из папки $template_dir</a></span></dt>
<dt><span class="sect2"><a href="template.resources.html#templates.from.any.dir">Шаблоны из произвольной папки</a></span></dt>
<dt><span class="sect2"><a href="template.resources.html#templates.from.elsewhere">Шаблоны из прочих источников</a></span></dt>
<dt><span class="sect2"><a href="template.resources.html#default.template.handler.function">Функция для обработки шаблона по умолчанию</a></span></dt>
</dl></dd>
</dl>
</div>
<div class="sect1" title="Объекты">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="advanced.features.objects"></a>Объекты</h2></div></div></div>
<p>
  Smarty позволяет использовать в шаблонах
  <a class="ulink" href="http://php.net/object" target="_top">объекты</a> PHP.
  Существуют два способа их вызова. Первый -
  <a class="link" href="api.register.object.html" title="register_object">зарегистрировать объект</a> для
  шаблона, затем вызвать его примерно так же, как и
  <a class="link" href="language.custom.functions.html" title="Chapter 8. Пользовательские Функции">пользовательские функции</a>.
  Второй - <a class="link" href="api.assign.html" title="assign()">назначить</a> объект шаблону и использовать его,
  как любую другую присвоенную переменную. Первый метод гораздо аккуратнее
  и безопаснее, так как у зарегистрированного объекта можно ограничить
  свойства и методы. Но, в тоже время, <span class="bold"><strong>зарегистрированный объект
  нельзя использовать в циклах, нельзя помещать в массив объектов</strong></span>,
  и так далее. Выбор способа за вами, но используйте по
  возможности первый, чтобы максимально упростить синтаксис шаблона.
 </p>
<p>
  В <a class="link" href="variable.security.html" title="$security">безопасном режиме</a>
  недоступны приватные методы и функции (имена которых начинаются с "_").
  Если существует и метод, и свойство с одинаковыми именами,
  то будет использован метод.
 </p>
<p>
  Вы можете ограничить использование объекта только некоторыми
  методами и свойствами. Для этого перечислите их в массиве и укажите
  этот массив третьим параметром при регистрации объекта.
 </p>
<p>
  По умолчанию, параметры из шаблона передаются объекту точно так же,
  как и
  <a class="link" href="language.custom.functions.html" title="Chapter 8. Пользовательские Функции">пользовательской функции</a>.
  Первым параметром передаётся
  ассоциативный массив, вторым - объект Smarty. Если вы хотите передавать
  параметры по одному, как при традиционном обращении с объектами, установите
  четвёртый параметр вызова в false.
 </p>
<p>
  Необязательный пятый параметр вступает в силу только в том случае, если
  свойство <em class="parameter"><code>format</code></em> равно <code class="literal">true</code>.
  Он содержит список методов, которые должны обрабатываться как блоки.
  Это означает, что в шаблоне у методы будут иметь закрывающие тэги
  (<code class="literal">{foobar-&gt;meth2}...{/foobar-&gt;meth2}</code>) и параметры
  методов будут иметь такие же синопсисы, как и параметры для
  <a class="link" href="plugins.block.functions.html" title="Блоковые функции">block-function-plugins</a>:
  <em class="parameter"><code>$params</code></em>,
  <em class="parameter"><code>$content</code></em>,
  <em class="parameter"><code>&amp;$smarty</code></em>
  и
  <em class="parameter"><code>&amp;$repeat</code></em>. Кроме того, они ведут себя так же, как и
  block-function-plugins.
 </p>
<div class="example">
<a name="id2735636"></a><p class="title"><b>Example 15.1. использование зарегистрированного или присвоенного объекта</b></p>
<div class="example-contents">
<pre class="programlisting">

&lt;?php
// сам объект

class My_Object {
	function meth1($params, &amp;$smarty_obj) {
		return 'this is my meth1';
	}
}

$myobj = new My_Object;
// регистрация объекта (по ссылке)
$smarty-&gt;register_object('foobar',$myobj);
// если мы хотим ограничить доступ к определенным методам или свойствам, перечисляем их
$smarty-&gt;register_object('foobar',$myobj,array('meth1','meth2','prop1'));
// если мы хотим использовать традиционный формат параметров объекта, передаем false
$smarty-&gt;register_object('foobar',$myobj,null,false);

// Мы так же можем назначать объекты. Назначение идёт по ссылке, если это возможно.
$smarty-&gt;assign_by_ref('myobj', $myobj);

$smarty-&gt;display('index.tpl');
?&gt;

  </pre>
<p>
   А вот так можно получить доступ к объекту в index.tpl:
  </p>
<pre class="programlisting">

{* обращаемся к нашему зарегистрированному объекту *}
{foobar-&gt;meth1 p1='foo' p2=$bar}

{* вывод объекта можно сохранить в переменную *}
{foobar-&gt;meth1 p1='foo' p2=$bar assign='output'}
the output was {$output}

{* обращаемся к нашему назначенному объекту *}
{$myobj-&gt;meth1('foo',$bar)}

  </pre>
</div>
</div>
<br class="example-break"><p>
  См. также
  <a class="link" href="api.register.object.html" title="register_object">register_object()</a>
  и
  <a class="link" href="api.assign.html" title="assign()">assign()</a>
 </p>
</div>
</div>
<div class="navfooter">
<hr>
<table width="100%" summary="Navigation footer">
<tr>
<td width="40%" align="left">
<a accesskey="p" href="caching.cacheable.html">Prev</a> </td>
<td width="20%" align="center"><a accesskey="u" href="smarty.for.programmers.html">Up</a></td>
<td width="40%" align="right"> <a accesskey="n" href="advanced.features.prefilters.html">Next</a>
</td>
</tr>
<tr>
<td width="40%" align="left" valign="top">Управление кэшированием результатов работы плагинов </td>
<td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td>
<td width="40%" align="right" valign="top"> Префильтры</td>
</tr>
</table>
</div>
</body>
</html>
